package pc

import (
	. "chess_platform/internal/common"
	"chess_platform/models/pc"
)

//[pc]log:日志管理
type LogController struct {
	GrantController
}

func (b *LogController) URLMapping() {
	//operation:操作日志
	b.Mapping("ListOperationLog", b.ListOperationLog)
	//error:错误日志
	b.Mapping("ListSubmitLog", b.ListSubmitLog)
	b.Mapping("StatSubmitLog", b.StatSubmitLog)
	b.Mapping("ListError", b.ListError)
	b.Mapping("UpdateErrorStatus", b.UpdateErrorStatus)
	b.Mapping("ListErrorLog", b.ListErrorLog)
}

// @Title  客户端打点日志列表
// @Description  客户端打点日志列表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   uid          body   int     false      "玩家id"
// @Param   start_time   body   int     false      "开始时间"
// @Param   end_time     body   int     false      "结束时间"
// @Param   content      body   string  false      "报错内容(模糊匹配)"
// @Param   status       body   int     false      "状态,问永利"
// @Param   mod          body   int     false      "模块,问永利"
// @Param   device_id    body   int     false      "设备id"
// @Success 0 {object} []common.Error 客户端错误日志列表
// @router /error/list-submit-log [post]
func (b *LogController) ListSubmitLog() {
	type Params struct {
		ListSubmitLogParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	error, count, err := pc.ListSubmitLog(p.ListSubmitLogParams)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = error
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title  客户端打点日志统计
// @Description  客户端打点日志统计
// @Param   uid          body   int     false      "玩家id"
// @Param   start_time   body   int     false      "开始时间"
// @Param   end_time     body   int     false      "结束时间"
// @Success 0 {object} []common.Error 客户端错误日志列表
// @router /error/stat-submit-log [post]
func (b *LogController) StatSubmitLog() {
	type Params struct {
		ListSubmitLogParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	error, err := pc.StatSubmitLog(p.ListSubmitLogParams)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = error
	b.ResponseSuccess()
}

// @Title  客户端错误日志列表
// @Description  客户端错误日志列表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   uid          body   int     false      "玩家id"
// @Param   start_time   body   int     false      "开始时间"
// @Param   end_time     body   int     false      "结束时间"
// @Param   content      body   string  false      "报错内容(模糊匹配)"
// @Param   model        body   string  false      "设备类型(模糊匹配)"
// @Param   version_id   body   string  false      "版本号(精准匹配)"
// @Param   is_unique    body   int     false      "结果是否去重,默认去重,1-不去重，0-去重"
// @Param   status       body   int     false      "是否已经处理了, 0-未处理,1-已处理"
// @Success 0 {object} []common.Error 客户端错误日志列表
// @router /error/list-error [post]
func (b *LogController) ListError() {
	type Params struct {
		IsUnique int64 `json:"is_unique" valid:"Range(0,1)"`
		ListErrorParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	error, count, err := pc.ListError(p.ListErrorParams, p.IsUnique)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = error
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 更新错误日志的状态
// @Description 更新错误日志的状态
// @Param   md5          body   string     true        "md5值"
// @Param   status       body   int        true        "是否已经处理了, 0-未处理,1-已处理"
// @Success 0 {string}  状态码
// @router /error/update-error-status [post]
func (b *LogController) UpdateErrorStatus() {
	type Params struct {
		Md5    string `json:"md5" valid:"Required"`
		Status int64  `json:"status" valid:"Range(0,1)"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	data := map[string]interface{}{
		"status": p.Status,
	}
	_, err := pc.UpdateErrorStatus(data, p.Md5)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.ResponseSuccess()
}

// @Title  客户端错误日志列表(手动提交的)
// @Description  客户端错误日志列表(手动提交的)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   uid          body   int     false      "玩家id"
// @Param   start_time   body   int     false      "开始时间"
// @Param   end_time     body   int     false      "结束时间"
// @Param   content      body   string  false      "报错内容(模糊匹配)"
// @Param   model        body   string  false      "设备类型(模糊匹配)"
// @Param   app_version  body   string  false      "APP(大厅)版本号(精准匹配)"
// @Param   game_version body   string  false      "游戏版本号(精准匹配)"
// @Success 0 {object} []common.Error 客户端错误日志列表
// @router /error/list-error-log [post]
func (b *LogController) ListErrorLog() {
	var p ListErrorLogParams
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	error, count, err := pc.ListErrorLog(p)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = error
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title  PC端操作日志列表
// @Description  PC端操作日志列表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   start_time   body   int     false      "开始时间"
// @Param   end_time     body   int     false      "结束时间"
// @Param   uid          body   int     false       "超级管理员才有权查询每个用户的操作日志"
// @Param   type         body   int     false       "操作类型,1-登录,2-退出,3-删除,4-新增,5-更新"
// @Param   module       body   int     false       "模块"
// @Param   name         body   string  false       "用户名字(支持模糊搜索)"
// @Success 0 {object} []common.Error PC端操作日志列表
// @router /operation/list-operation-log [post]
func (b *LogController) ListOperationLog() {
	type Params struct {
		ListParams
		ListDayParams
		Uid    int64  `json:"uid"`
		Type   int64  `json:"type"`
		Module int64  `json:"module"`
		Name   string `json:"name"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	var uid int64
	if b.IsCompany() { //属于公司的,可以查看所有大区所有人的操作日志
		if p.Uid != 0 { //不为0表明要指定人员的
			uid = p.Uid
		}
		//默认查看所有的
	} else { //不属于公司
		uid = b.Uid
	}
	data, count, err := pc.ListOperationLog(p.ListParams, p.ListDayParams, uid, p.Type, p.Module, p.Name)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}
